#include <iostream>
#include <vector>
#include <queue> // 优先级队列的头文件

using namespace std;

int a[10] = {1, 41, 23, 10, 11, 2, -1, 99, 14, 0};

struct node
{
    int a, b, c;

    // 重载 < 运算符
    // 按照 b 为基准，创建大根堆
    // bool operator < (const node& x) const
    // {
    //     return b < x.b;
    // }

    // 按照 b 为基准，创建小根堆
    bool operator < (const node& x) const
    {
        return b > x.b;
    }
};

// 结构体类型
void test2()
{
    priority_queue<node> heap;

    for(int i = 1; i <= 5; i++)
    {
        heap.push({i + 5, i + 1, i + 2});
    }

    while(heap.size())
    {
        node t = heap.top(); heap.pop();
        cout << t.a << " " << t.b << " " << t.c << endl;
    }
}


// 内置类型
void test1()
{
    // 大根堆
    priority_queue<int> heap1; // 默认就是大根堆

    // priority_queue<数据类型, 存储结构, 比较方式>
    // less 和 greater
    priority_queue<int, vector<int>, less<int>> heap2;

    // 小根堆
    priority_queue<int, vector<int>, greater<int>> heap3;

    // 记忆方式：
    // 大根堆用小于
    // 小根堆用大于

    for(int i = 0; i < 10; i++)
    {
        heap2.push(a[i]);
        heap3.push(a[i]);
    }

    cout << "大根堆：";
    while(heap2.size())
    {
        cout << heap2.top() << " ";
        heap2.pop();
    }
    cout << endl;

    cout << "小根堆：";
    while(!heap3.empty())
    {
        cout << heap3.top() << " ";
        heap3.pop();
    }

}

int main()
{
    test2();

    // priority_queue<int> heap; // 默认是一个大根堆

    // for(int i = 0; i < 10; i++)
    // {
    //     heap.push(a[i]);
    // }

    // while(heap.size()) // while(!heap.empty())
    // {
    //     cout << heap.top() << " ";
    //     heap.pop();
    // }

    return 0;
}